package collection.stream;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * JDK8之后，集合提供了流式操作，以流的处理思路完成对集合元素的操作
 *
 * 集合提供了一个方法:stream()
 *             该方法可以将集合变为一个"流",可以和IO联想，那么流中的内容就是集合中
 *             的每个元素。
 *             我们可以向流上添加各种中间环节(相当于IO操作中的高级流)，每个中间环节
 *             会将元素经过时进行对应的处理
 *             最后要在Stream上添加终端环节，用于得到最终的处理结果
 *              集合       ->       中间环节      -> 终端环节
 *             +------+         +---+     +--+     +----+
 *             | x,x,x|---------|处 |-----|处 |-----|    |
 *             | x,x,x|---------|理 |-----|理 |-----|    |
 *             +------+         +---+     +--+     +----+
 */
public class StreamApiDemo {
    public static void main(String[] args) {
        //向一个集合中添加10个随机数
        List<Integer> list = new ArrayList<>();
        for (int i=0;i<10;i++){
            list.add((int)(Math.random()*10));
        }
        System.out.println(list);
        /*
            常见的中间环节:
            1:map
              map方法接收一个lambda表达式，并将集合中每个元素都经历一次
              该表达式，然后将表达式处理的结果替换该元素
            2:filter
              filter方法可以过滤流中的每个元素，仅保留符合lambda表达式
              要求的元素
            3:distinct
              distinct方法可以过滤重复的元素
            4:sorted
              sorted方法可以对流中的元素排序
              该方法接收一个lambda表达式用于定义Comparator

         */
        //将集合每个元素扩大3倍
        List<Integer> list2 = list.stream()//将集合变为一个"流"
                                  .map(e->e*3)//添加map中间环节，对每个元素处理
                                  .collect(Collectors.toList());//终端环节，收集流最后的所有元素
        System.out.println(list2);

        //仅保留集合中的所有偶数
        List<Integer> list3 = list.stream()
                                  .filter(e->e%2==0)
                                  .collect(Collectors.toList());
        System.out.println(list3);

        //对集合元素去重
        List<Integer> list4 = list.stream()
                                  .distinct()
                                  .collect(Collectors.toList());
        System.out.println(list4);

        //对集合元素降序排序
        List<Integer> list5 = list.stream()
                                  .sorted((e1,e2)->e2-e1)
                                  .collect(Collectors.toList());
        System.out.println(list5);


        //对集合每个元素扩大3倍并获取其中所有的偶数然后去除集合重复元素并降序排序
        List<Integer> list6 = list.stream()
                                  .map(e->e*3)
                                  .filter(e->e%2==0)
                                  .distinct()
                                  .sorted((e1,e2)->e2-e1)
                                  .collect(Collectors.toList());
        System.out.println(list6);
    }
}
